/*******************************************************************************
 * Copyright (c) 2006 CEA List.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     CEA List - initial API and implementation
 *******************************************************************************/
package com.cea.papyrus.diagram.classdiagram.helper;

import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Interface;
import org.eclipse.uml2.uml.Reception;

import com.cea.papyrus.core.helper.NodeHelper;
import com.cea.papyrus.core.utils.Debug;
import com.cea.papyrus.core.utils.LookForElement;
import com.cea.papyrus.diagram.classdiagram.Activator;
import com.cea.papyrus.diagram.classdiagram.preference.ClassDiagramPreferenceConstants;
import com.cea.papyrus.diagraminterchange2.di2.Diagram;
import com.cea.papyrus.diagraminterchange2.di2.GraphElement;
import com.cea.papyrus.diagraminterchange2.di2.GraphNode;
import com.cea.papyrus.diagraminterchange2.di2.Uml1SemanticModelBridge;

/**
 * Factory that can create and delete an {@link Reception}}.
 * 
 * @author Patrick Tessier, Remi Schnekenburger
 */
public class NodeReceptionHelper extends NodeHelper {
	

	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.INodeFactory#createGraphNode(org.eclipse.uml2.uml.umlNamedElement, com.cea.papyrus.diagraminterchange2.di2.Diagram)
	 */
	/**
	 * 
	 * 
	 * @param umlElement 
	 * @param diagram 
	 * 
	 * @return 
	 */
	@Override
	public ArrayList createGraphNode(Element umlElement, Diagram diagram) {
		
		//Debug.debug(this,"Call ModelResourceManager.createGraphNode() pour "+ umlElement.getClass()+ " dans "+diagram.getName(), debugChannel);
		
	    //look for graphNode of the umlElement parent
	    ArrayList parentGraphNode=LookForElement.lookForGraphElement(umlElement.getOwner(), diagram, new ArrayList());
	    //ArrayList parentGraphNode=.getRessourceManager().lookForGraphElement((NamedElement)umlElement.getOwner(), diagram, new ArrayList());
		Iterator it =parentGraphNode.iterator();
		ArrayList createdNode=new ArrayList();
		// this an array of graphNode linked to each Class node is 
		
		while(it.hasNext()){
			//current node
			GraphNode currentNode=(GraphNode)it.next();
			
			//node creation
			NodeHelper nf= new NodeHelper();
			GraphNode graphNode=nf.createGraphElement(umlElement,currentNode,null,null);
		}
	return createdNode;
	}
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#canExecuteCreateCommand(com.cea.papyrus.diagraminterchange2.di2.GraphNode)
	 */
	/**
	 * Can execute.
	 * 
	 * @param parent the parent
	 * 
	 * @return true, if can execute
	 */
	@Override
	public boolean canCreateGraphElement(GraphElement parent){
		if (!(parent instanceof Diagram)) {//the parent must be a graphNode

			if(parent.getSemanticModel()==null){ // the parent must a Feature
				GraphElement gp=parent.getContainer();//look for GreatParent
				
				if (gp!=null){
					if (!(gp instanceof Diagram)) {//great parent is not a diagram
						if(gp.getSemanticModel()!=null){ //it is linked to an UML element
							Element elt= ((Uml1SemanticModelBridge)gp.getSemanticModel()).getElement();
							
							return this.canCreateUMLElement(elt);
						}
					}
				}
			}
		}
		return false;
	}
	
	
	///////////////////////////////////////////////////////////////////////////
	// UML management
	///////////////////////////////////////////////////////////////////////////
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#createElement(java.lang.String, org.eclipse.uml2.uml.umlElement)
	 */
	/**
	 * 
	 * 
	 * @param umlParent 
	 * @param name 
	 * 
	 * @return 
	 */
	@Override
	public org.eclipse.uml2.uml.Element createUMLElement(String name, org.eclipse.uml2.uml.Element umlParent){
		Debug.debug(this,"Call createElement()", channel); //$NON-NLS-1$
		org.eclipse.uml2.uml.Reception reception=null;
		if (umlParent instanceof org.eclipse.uml2.uml.Class){
			reception=((org.eclipse.uml2.uml.Class)umlParent).createOwnedReception(name,null,null);
		}
		if (umlParent instanceof org.eclipse.uml2.uml.Interface){
			reception=((org.eclipse.uml2.uml.Interface)umlParent).createOwnedReception(name,null,null);
		}
		return reception;
	}
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#canExecuteCreateElement(org.eclipse.uml2.uml.Element)
	 */
	/**
	 * 
	 * 
	 * @param umlParent 
	 * 
	 * @return 
	 */
	@Override
	public boolean canCreateUMLElement(Element umlParent) {
		//a reception maybe add if the class is active
		if(umlParent instanceof org.eclipse.uml2.uml.Class&& ((Class)umlParent).isActive() ) {
			return true;
		}
		if( umlParent instanceof Interface){
			return true;
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#addElement(org.eclipse.uml2.uml.Element, org.eclipse.uml2.uml.Element)
	 */
	/**
	 * 
	 * 
	 * @param element 
	 * @param umlParent 
	 * 
	 * @return 
	 */
	@Override
	public boolean addUMLElement(Element element, Element umlParent) {
		if(umlParent instanceof org.eclipse.uml2.uml.Class && ((Class)umlParent).isActive() ) {
			return ((org.eclipse.uml2.uml.Class)umlParent).getOwnedReceptions().add((Reception)element);
		}
		if(umlParent instanceof Interface) {
			return ((Interface)umlParent).getOwnedReceptions().add((Reception)element);
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#removeElement(org.eclipse.uml2.uml.Element, org.eclipse.uml2.uml.Element)
	 */
	/**
	 * 
	 * 
	 * @param element 
	 * @param umlParent 
	 * 
	 * @return 
	 */
	@Override
	public boolean removeUMLElement(Element element, Element umlParent) {
		if(umlParent instanceof org.eclipse.uml2.uml.Class) {
			return ((org.eclipse.uml2.uml.Class)umlParent).getOwnedReceptions().remove(element);
		}
		if(umlParent instanceof Interface) {
			return ((Interface)umlParent).getOwnedReceptions().remove(element);
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.factories.NodeFactory#getBaseString()
	 */
	/**
	 * 
	 * 
	 * @return 
	 */
	@Override
	public String getBaseString() {
		return "Reception_";  //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see com.cea.papyrus.common.helper.NodeHelper#setGraphElementPreferences(com.cea.papyrus.diagraminterchange2.di2.GraphElement)
	 */
	/**
	 * 
	 * 
	 * @param graphElement 
	 */
	@Override
	public void setGraphElementPreferences(GraphElement graphElement) {
		// Get the preference store
		IPreferenceStore store = Activator.getDefault().getPreferenceStore();
		
		// Set colors and font
		graphElement.setBackgroundColor(ClassDiagramPreferenceConstants.getPreferenceReceptionBackgroundColor(store));
		graphElement.setBorderColor(ClassDiagramPreferenceConstants.getPreferenceReceptionBorderColor(store));
		graphElement.setFontColor(ClassDiagramPreferenceConstants.getPreferenceReceptionFontColor(store));
		FontData[] fontdata = ClassDiagramPreferenceConstants.getPreferenceReceptionFont(store);
		if (fontdata.length>0){
			graphElement.setFontFamily(fontdata[0].getName());
			graphElement.setFontSize(fontdata[0].getHeight());
		}
	}
}